package br.ufrj.dcc.ad.systems;

import java.util.LinkedList;
import java.util.Queue;

import br.ufrj.dcc.ad.generators.TimeGenerator;

public class Fifo extends Fila {
	/**
	 * Inicializa uma fila com politica de atendimento FIFO.
	 * @param geradorServico Gerador de tempos de serviço desta fila.
	 */
	public Fifo(TimeGenerator geradorServico){
		super(geradorServico);
		Queue<Cliente> fifo = new LinkedList<Cliente>(); 
		this.clientes = fifo;
	}
	
	@Override
	public void add(Cliente cliente) {
		Queue<Cliente> fifo = (Queue<Cliente>)clientes;
		fifo.add(cliente);
	}

	@Override
	public void remove(Cliente cliente) {
		Queue<Cliente> fifo = (Queue<Cliente>)clientes;
		fifo.remove(cliente);
	}

	@Override
	public void reenter(Cliente cliente) {
		Queue<Cliente> filaNova = new LinkedList<Cliente>();
		Queue<Cliente> filaAntiga = (Queue<Cliente>) clientes;
		if(!filaAntiga.contains(cliente)){
			filaNova.add(cliente);
		}
		filaNova.addAll(filaAntiga);
		clientes = filaNova; 
	}
	
	@Override
	public void interruptReenter(Cliente cliente) {		
		if(!clientes.contains(cliente)){
			add(cliente);
		}
	}
	
	@Override
	public Cliente getAndRemoveNext() {
		return ((Queue<Cliente>)clientes).poll();
	}

	@Override
	public Cliente seeNext() {
		return ((Queue<Cliente>)clientes).peek();
	}
	
	@Override
	public Cliente lessPriority(Cliente cliente1, Cliente cliente2) {
		if(cliente1.getNome().compareTo(cliente2.getNome()) > 0){
			return cliente1;
		}
		return cliente2;
	}
}
